Au boulot !

![Un halo, que moi j'appelle «arc-en-neige»](/media/2021/arc-en-neige.jpg)

Après quelques mois de trop passés à essayer à tout prix de boucler un article pour expliquer tous mes déboires dans mes tentatives de l'année passée de rafraîchir un peu mon matériel informatique et les logiciels que j'utilise, je me dis qu'il est grand temps de faire une pause et de parler un peu d'autre chose en attendant.

Surtout que, ce début d'année est plein de promesses pour moi. Je suis à la fin de ma [convalescence](/articles/Compte%20à%20rebours.html), j'ai reçu plein d'intéractions motivantes autour de [hablo](https://git.marvid.fr/Tissevert/hablo) et je m'apprête d'ici quelques jours à entamer la thèse en Traitement Automatique des Langues dont je rêve depuis si longtemps !!

J'ai donc la joie de vous annoncer la sortie de [Hablo 1.1](https://git.marvid.fr/Tissevert/hablo/releases) !! Plus précisément, `hablo` vient d'atteindre la version `1.1.0.1` suivant la [politique de versionnement des paquets](https://pvp.haskell.org/) de Haskell. J'étais toute contente d'avoir ajouté deux toutes petites fonctionnalités… quand je me suis rendue compte au moment de déposer le paquet sur [hackage](https://hackage.haskell.org/) que j'avais introduit un bug et que mes nouveaux paquets ne compilaient pas sur la toute dernière release de `nix` : /

D'ailleurs, [nix](https://nixos.org/) a l'air d'être le point central de mes ennuis en ce moment. J'ai beaucoup à lui reprocher et aussi beaucoup de mérites à lui concéder. Pendant le temps — certes long — où je me suis débattue avec cet autre article, un certain nombres d'aventures sont venues ajouter aux deux côtés de la balance. Bref, il va falloir poser les choses à plat et peut-être répartir tout le texte sur quelques articles.

## Quoi de neuf ?

Les fonctionnalités apportées par cette nouvelle version sont assez basiques même si elles s'accompagnent d'un changement technique assez important puisque maintenant tout le code Javascript généré pour le blog (contenant les métadonnées, le code pour la navigation et la gestion des commentaires) est assemblé en un script unique chargé en une seule fois avec [SJW](https://git.marvid.fr/Tissevert/SJW).

### Pages statiques

J'ai (enfin !) implémenté les pages statiques, prévues dès l'origine du projet mais dont je n'avais pas eu besoin avant. Très simplement, les fichiers présents dans le répertoire `pages` (ou [celui que vous aurez choisi](https://git.marvid.fr/Tissevert/hablo/wiki/Command-line#user-content-pages-path)) sont répertoriés dans une liste de navigation à part des articles. Si la liste est vide, elle ne figure pas du tout sur le site (même pas son titre).

En fait les listes d'articles et de pages sont maintenant optionnelles (tant qu'au moins une des deux n'est pas vide). Vous pouvez donc utiliser `hablo` seulement pour générer un petit site statique sans un «fil» d'articles comme un blog.

### Flux RSS

J'ai constaté quelque chose de très plaisant sur la Fédiverse ces derniers temps ! Les gens ont l'air de se souvenir que l'on sait diffuser des contenus mis à jours régulièrement sans avoir besoin d'un compte sur un réseau social depuis plus de [21 ans](https://fr.wikipedia.org/wiki/RSS) !! Je vois des blogs revenir à RSS pour permettre leur suivi alors je me suis rendue compte qu'il était grand temps que `hablo` le permette.

Pour l'instant, l'idée pour moi est vraiment de rester au stade de la notification, les flux générés ne contiennent que le titre de l'article et un lien vers la page, mais ça pourrait changer en fonction des besoins. Je vois quelques flux dans mes abonnements qui contiennent l'article en entier et me permettent de le lire depuis mon client RSS. Je sais pas, vous en pensez quoi ?

### Distribution

Ça fait bientôt 2 ans que j'ai sorti la [toute première version](/articles/Hablo.html) de `hablo` et jusqu'ici c'était surtout pour mon bon plaisir. Un immense merci à [Cafou](https://kawen.space/users/cafou), [PirBoazo](https://hostux.coffee/users/PirBoazo) et [Gérald](https://pleroma.gegeweb.eu/users/gerald) pour tout le temps qu'ils ont passé à essayer `hablo`, à me faire des retours et des critiques !! Merci infiniment, c'est ce genre d'intéraction qui enrichit la réflexion et alimente le développement d'un logiciel libre.

PirBoazo m'a fait remettre les mains dans `nix` et me rendre compte que mon beau paquet tout propre prêt à être déposé sur `hackage`… ne fonctionnait même pas sous la version la plus récente de `nixOS`, la 20.09 (il avait marché dans la machine virtuelle de test que je n'avais pas mise à jour vers septembre~octobre parce que j'avais clairement autre chose à faire dans ma vie à ce moment-là ^^).

En créant des `channels` `nix` pour chaque version antérieure de `nixOS`, j'ai même pu généraliser le processus et remonter le temps pour tester la compatibilité de mes paquets avec des versions plus anciennes de leurs dépendances. Il semble que j'arrivais à remonter sans trop de problème jusqu'à mars 2018 mais un bug dans `cabal` 2.1 empêche les tests (`hablo` a enfin une suite de test pour vérifier la stabilité des modifications futures) de fonctionner et fait donc échouer la compilation de la dérivation. J'ai donc élargi les versions supportées jusqu'à `nixos` 18.09.

Elle m'a été bien utile, cette gym avec `nix` : d'une installation précaire sur notre serveur et qui faisait tomber la machine en la reconfigurant sans les droits d'administration depuis le passage à la 20.09, justement, j'ai pu écrire de jolies dérivations bien propres qui permettent de tester très rapidement `hablo` «sans engagement» avec `nix` ou de l'installer de manière plus pérenne. J'ai même créé un [dépôt](https://git.marvid.fr/Tissevert/mynixpkgs) où je publierai à l'avenir les dérivations `nix` pour mes paquets. Je compte faire pareil avec des expressions `scheme` pour `guix` dès que j'en aurai l'occasion.

Comble ! Moi qui me suis frottée (et [piquée](/articles/La%20source%20du%20Mal) !) il n'y a pas si longtemps à la création d'applications pour MacOS, `nix` — disponible pour cette plateforme — a fourni une solution de secours bien pratique à Gérald qui souhaitait tester `hablo` dessus. Et ça a marché ! C'est maintenant testé, `hablo` tourne sur Mac.

Et comme grâce à `nix` toute la distribution du code est bien propre, j'ai même enfin pu mettre à jour les paquets dans les dépôt `hackage`

- [SJW](https://hackage.haskell.org/package/SJW)
- [hablo](https://hackage.haskell.org/package/hablo)

Ça fait que maintenant sur une machine avec `cabal` et sa base de paquets mise à jour, un simple:

```bash
cabal new-install hablo
```

devrait marcher : )

## Et la suite ?

Toutes ces discussions ont été l'occasion de lancer des pistes de réflexion pour la suite du développement.

### Rendre `hablo` entièrement statique ?

Le choix d'effectuer le rendu du Markdown en HTML par du code Javascript dans le navigateur web à l'affichage du site ne fait manifestement pas l'unanimité; j'ai bien compris qu'un mode de rendu entièrement statique serait bienvenu, même si mon choix de conserver les fichiers source en Markdown a manifestement un sens, surtout avec l'arrivée de [gemini](https://gemini.circumlunar.space/).

Peut-être devrais-je faire un module de mon système de navigation légère avec mise en cache de tous les articles pour améliorer la fluidité et limiter le plus possible les requêtes au serveur et le rendre optionnel ? Ça rejoindrait le fait de mettre à disposition le code que j'ai écrit pour utiliser une instance de la Fédiverse pour gérer les commentaires. C'était l'idée principale que j'ai apportée dans `hablo`, ce qui facilitait l'auto-hébergement en permettant des performances correctes même sur des serveurs minuscules, mais peut-être n'est-ce pas pour tout le monde ?

En tout cas il a été question d'enlever complètement l'aperçu du Markdown des articles des pages listant les articles (par tags ou vue générale), soit pour le rendre déjà en HTML à la génération du site, soit pour le remplacer par des blocs de métadonnées qui décriraient les articles et seraient eux des liens vers la source Markdown.

### Des thèmes

Je pensais que tout le monde voulait faire sa popotte dans son coin pour le design mais [manifestement](http://blog.boizot.ch/) mon thème pour ce blog a bien plu : ) Plus sérieusement, je crois que proposer quelques exemples de thèmes aiderait les gens intéressés par le projet à se faire plus rapidement une idée de ce qui est faisable avec `hablo`.

### Le code Javascript

Il en a déjà été question non ? ^^ J'étais un peu mal à l'aise avec la librairie utilisée, [Remarkable](https://github.com/jonschlinkert/remarkable), sans doute parce qu'ayant retardé le rendu du HTML le plus tard possible, la librairie ne concerne pas directement l'exécutable `hablo` que je distribue. Mais enfin, elle est nécessaire pour les clients du blog généré, il faudrait que `hablo` fasse sa petite tambouille pour en télécharger une copie, peut-être vérifier qu'elle est à jour…

Ce qui nous amène au reste du code JS. C'est écrit en JS pur, assemblé en un script unique avec `SJW`. Je n'ai pas encore prévu de mécanisme de gestion de version des scripts dedans, il va falloir faire quelque chose de ce côté-là dès que je vais introduire des changements non rétrocompatibles (et ils arrivent, j'ai une branche avec des boucles, de la curryfication et une refonte un peu mieux basée théoriquement de ma monade [CPS curryfiée](https://git.marvid.fr/Tissevert/UnitJS/src/branch/loops/src/UnitJS/Async.js)).

### Sauver la configuration

On m'a reproché aussi l'absence d'un fichier de configuration pour ne pas avoir à réécrire toutes les options à chaque invocation de `hablo`. Certes ce serait utile mais voulant toujours réutiliser le plus de choses possibles j'utilise simplement un [Makefile](https://www.gnu.org/software/make/). Et pourquoi ne pas carrément faire un petit dialogue pour initialiser les blogs qui génère un `Makefile` simple que tout le monde puisse ensuite adapter à sa convenance ?

### Le répertoire racine

Mon cas d'usage, c'est que ce blog est sur son propre site à part. Je n'aime pas laisser plein de détails contingents dans des fichiers que ça ne concerne pas vraiment et j'ai vraiment tout fait dans le design pour que tout soit le plus portable possible. J'aimais bien qu'on puisse exposer les fichiers sur un site ou sur un autre et que tout marche.

Ça a été un vrai crève-cœur quand l'implémentation des cartes [Open Graph](https://ogp.me/) dans la Fédiverse a changé et requis l'[ajout de la propriété `og:url`](https://git.marvid.fr/Tissevert/hablo/commit/36651ddc38461025ed997054eab9325aa8d905d1) avec l'URL canonique de la ressource, incluant le nom de domaine.

Je ne suis vraiment pas fan d'ajouter une option pour donner à `hablo` le sous-répertoire du site où sera déployé le blog mais il est clair que ça manque. J'avais utilisé des URL absolues pour simplifier les choses et ne pas devoir inclure dans toutes les inclusions de fichiers un `../` ou `./` en fonction du niveau du site, j'hésite presque entre complexifier le système en faisant cette distinction et rajouter cette option. On verra, mais en tout cas je vais y faire quelque chose, promis.


### Traduction

Au niveau de la langue du blog, toutes les chaînes de texte sont des templates et donc aménageables à la convenance de la personne qui rédige mais je me suis retrouvée toute penaude à devoir répondre que, non, ma documentation était écrite seulement en anglais. Comment j'aurais pu penser une seule seconde que mon projet intéresserait qui que ce soit d'autre que moi ? Comment, admettant cette prémice invraisemblable, j'aurais pu penser qu'en plus les gens qui s'y intéresseraient parleraient français ?

Moi, la francophone acharnée qui ne part jamais en weekend mais toujours en fin de semaine et qui fait rire mon père quand je lui raconte que j'ai été magasiner, me faire épingler là-dessus c'est… oui bin bon voilà, va falloir que je traduise la doc.

### Le parser Markdown

Bon et sinon il y a des points techniques que j'aimerais améliorer même si ça n'intéresse encore que moi pour l'instant.

- je n'ai pas écrit de vrai parser de Markdown pour la phase statique, vu qu'il s'agit seulement d'extraire des métadonnées, mon truc ne supporte même pas l'utilisation de la propriété `title` à la place du `# Titre Markdown` habituel. Faut que je règle ça, quitte à m'appuyer sur un parser existant si le public demande vraiment un mode de rendu entièrement statique des articles en HTML
- j'utilise directement les titres des articles comme identifiant, ça pose problème à la [validation W3C](https://validator.w3.org/nu/?doc=https%3A%2F%2Fnanika.marvid.fr%2F) qui n'aime pas les espaces ni dans les identifiants d'éléments du DOM ni dans les cibles `href` des liens, je vais corriger ça.

Voilà un peu les choses que j'ai retenues et qui devraient apparaître dans `hablo` d'ici pas trop longtemps si je réussis à ne pas me faire engloutir par ma thèse. *cue canned laughter*